#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

sem_t empty;
sem_t apple;
sem_t orange;


void *father_thread(void *args) {
	while (1) {
		// 如果盘子不是空的就等待
		sem_wait(&empty);
		sleep(rand() % 3);
		printf("爸爸放入一个苹果!\n");
		// 通知儿子可以吃苹果了
		sem_post(&apple);
	}
}

void *mother_thread(void *args) {
	while (1) {
		// 如果盘子不是空的就等待
		sem_wait(&empty);
        sleep(rand() % 3);
        printf("妈妈放入一个橙子!\n");
		// 通知女儿可以吃橙子了
		sem_post(&orange);
	}
}

void *son_thread(void *args) {
	while (1) {
		// 如果没有苹果，则等待
		sem_wait(&apple);
		sleep(rand() % 5);
		printf("儿子吃了一个苹果!\n");
		// 通知爸爸妈妈可以放水果了
		sem_post(&empty);
	}
}

void *daughter_thread(void *args) {
	while (1) {
		// 如果没有橙子，则等待
		sem_wait(&orange);
		sleep(rand() % 5);
		printf("女儿吃了一个橙子!\n");
		// 通知爸爸妈妈可以放水果了
		sem_post(&empty);
	}
}


int main() {
	pthread_t father;  //定义线程
    pthread_t mother;
    pthread_t son;
    pthread_t daughter;

    sem_init(&empty, 0, 3);  //信号量初始化
    sem_init(&apple, 0, 0);
    sem_init(&orange, 0, 0);
	
	pthread_create(&father, NULL, father_thread, NULL);  //创建线程
    pthread_create(&mother, NULL, mother_thread, NULL);
    pthread_create(&daughter, NULL, daughter_thread, NULL);
    pthread_create(&son, NULL, son_thread, NULL);
	
	sleep(100);
	return 1;
}
